package com.cy.pj.sys.service.impl;

import com.cy.pj.common.bo.PageObject;
import com.cy.pj.common.exception.ServiceException;
import com.cy.pj.sys.dao.SysRoleDao;
import com.cy.pj.sys.dao.SysRoleMenuDao;
import com.cy.pj.sys.dao.SysUserRoleDao;
import com.cy.pj.sys.entity.SysRole;
import com.cy.pj.sys.service.SysRoleService;
import com.cy.pj.sys.vo.SysRoleMenuVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thymeleaf.util.StringUtils;

import java.util.List;

/**
 * @author LiuXu
 * @create 2020-07-20 9:38
 */
@Service
public class SysRoleServiceImpl implements SysRoleService {
    @Autowired
    private SysRoleDao sysRoleDao;
    @Autowired
    private SysRoleMenuDao sysRoleMenuDao;
    @Autowired
    private SysUserRoleDao sysUserRoleDao;


    @Override
    public int updateObject(SysRole entity, Integer[] menuIds) {
        if (entity == null) {
            throw new IllegalArgumentException("更新的对象不能为空");
        }
        if (entity.getId() == null) {
            throw new IllegalArgumentException("id值不能为空");
        }
        if (StringUtils.isEmpty(entity.getName())) {
            throw new IllegalArgumentException("角色名不能为空");
        }
        if (menuIds == null || menuIds.length == 0) {
            throw new IllegalArgumentException("必须给角色指定一个权限");
        }

        int rows = sysRoleDao.updateObject(entity);
        if (rows == 0) {
            throw new ServiceException("对象可能已经不存在");
        }
        sysRoleMenuDao.deleteObjectsByRoleId(entity.getId());
        sysRoleMenuDao.insertObjects(entity.getId(), menuIds);

        return rows;
    }


    @Override
    public int saveObject(SysRole entity, Integer[] menuIds) {
        if (entity == null) {
            throw new IllegalArgumentException("保存对象不能为空");
        }
        if (StringUtils.isEmpty(entity.getName())) {
            throw new IllegalArgumentException("角色名不允许空");
        }
        if (menuIds == null || menuIds.length == 0) {
            throw new ServiceException("必须为角色分配权限");
        }
        int rows = sysRoleDao.insertObject(entity);
        sysRoleMenuDao.insertObjects(entity.getId(), menuIds);
        return rows;
    }

    @Override
    public SysRoleMenuVo findObjectById(Integer id) {
        //1.合法性验证
        if (id == null || id <= 0)
            throw new IllegalArgumentException("id的值不合法");
        //2.执行查询
        SysRoleMenuVo result = sysRoleDao.findObjectById(id);
        //3.验证结果并返回
        if (result == null)
            throw new ServiceException("此记录已经不存在");
        return result;

    }

    @Override
    public PageObject<SysRole> findPageObjects(String name, Integer pageCurrent) {

        //参数校验
        if (pageCurrent == null || pageCurrent < 1) {
            throw new IllegalArgumentException("当前页码无效");
        }
        //查询总记录数并校验
        int rowCount = sysRoleDao.getRowCount(name);
        if (rowCount == 0) {
            throw new ServiceException("没有找到对应记录");
        }
        int pageSize = 2;
        int startIndex = (pageCurrent - 1) * pageSize;
        List<SysRole> records = sysRoleDao.findPageObjects(name, startIndex, pageSize);

        //返回查询结果
        return new PageObject<>(pageCurrent, pageSize, rowCount, records);
    }

    @Override
    public int deleteObject(Integer id) {
        //验证数据合法性
        if (id == null || id <= 0) {
            throw new IllegalArgumentException("请先选择");
        }
        sysRoleMenuDao.deleteObjectsByRoleId(id);
        sysUserRoleDao.deleteObjectsByRoleId(id);
        //删除角色自身
        int rows = sysRoleDao.deleteObject(id);
        if (rows == 0) {
            throw new ServiceException("该记录可能已经不存在");
        }
        return rows;
    }
}
